package web;

import   java.io.IOException;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import model.Accion;
import model.Precio;

import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import service.ServiceProvider;

// Clase para obtener los precios del ultimo mes de una accion dada

public class AmbitoHistoricoServlet extends HttpServlet {
	
	private static final long serialVersionUID = 1L;
	
	private static final int COLUMNA_FECHA = 0;
	private static final int COLUMNA_ULTIMO = 2;
	
	private static final String AMBITO_HISTORICO_URL = "http://www.ambito.com/economia/mercados/acciones/?ric="; 
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		String ric = req.getParameter("ric");
        resp.setContentType("text/html");        
        Connection c = Jsoup.connect(AMBITO_HISTORICO_URL + ric);
        Document d = c.get();
        
        
        Accion a = new Accion();
        a.setRic(ric);
        a.setPrecios(new ArrayList<Precio>());
        
        Accion existe = ServiceProvider.getDao().getAccionByRic(ric);
        if (existe != null){
        	a = existe;
        }

        Elements tables = d.getElementsByClass("verdanita");
        
        // Tablas de la pagina
        for (int i = 0; i < tables.size(); i++){
        	Element e = tables.get(i);
        	
        	Elements tableRows = e.select("tr");
        	// Row de la tabla
        	for (int j = 1; j < tableRows.size() ; j = j + 2){
        		Precio p = new Precio();
        		Element tableRow = tableRows.get(j);        		
        		Elements tableRowData = tableRow.select("td");        		
        		// Datos de cada row
        		for (int k = 0; k < tableRowData.size(); k++){
        			if (j > 0 && k <= COLUMNA_ULTIMO){
	        			Element td = tableRowData.get(k);	        			
	        			String tdText = td.select("div").get(0).ownText();
	       			
	        			if (k == COLUMNA_ULTIMO && j > 0){
	        				String num = tdText.replace(".", ""); 
	        				p.setValor(new BigDecimal(num.replace(',', '.')));
	        			} 
	        			if (k == COLUMNA_FECHA && j > 0){
	        				Date fecha = null;
	        				SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
	        				try {
	        					String fechaSinHora = tdText;
	        					fechaSinHora = fechaSinHora.replaceAll(" ENE ", "/01/");
	        					fechaSinHora = fechaSinHora.replaceAll(" FEB ", "/02/");
	        					fechaSinHora = fechaSinHora.replaceAll(" MAR ", "/03/");
	        					fechaSinHora = fechaSinHora.replaceAll(" ABR ", "/04/");
	        					fechaSinHora = fechaSinHora.replaceAll(" MAY ", "/05/");
	        					fechaSinHora = fechaSinHora.replaceAll(" JUN ", "/06/");
	        					fechaSinHora = fechaSinHora.replaceAll(" JUL ", "/07/");
	        					fechaSinHora = fechaSinHora.replaceAll(" AGO ", "/08/");
	        					fechaSinHora = fechaSinHora.replaceAll(" SEP ", "/09/");
	        					fechaSinHora = fechaSinHora.replaceAll(" OCT ", "/10/");
	        					fechaSinHora = fechaSinHora.replaceAll(" NOV ", "/11/");
	        					fechaSinHora = fechaSinHora.replaceAll(" DIC ", "/12/");
	        					
								fecha = sdf.parse(fechaSinHora);
								
							} catch (ParseException e1) {
								e1.printStackTrace();
							}
	        				if (fecha == null){
	        					fecha = new Date();
	        				}
	        				p.setFecha(fecha);
	        			}
        			}
        		}	
        		if (j > 0){
        			a.agregarPrecio(p);
        		}
        	}        	
        }
        
        // then get the writer and write the response data
        PrintWriter out = resp.getWriter();
        out.println("<HEAD><TITLE>Cotizaciones Historicas ambito.com para " + ric + "</TITLE></HEAD><BODY>");
        out.println("<a href=\"/tpfinal\">Menu</a>");
        out.println("<table>");
        out.println("<tr><td>RIC</td><td>PRECIO</td><td>FECHA</td></tr>");
        for (Precio p : a.getPrecios()){
        	SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        	String fechaStr = sdf.format(p.getFecha());
            out.println("<tr><td>" + a.getRic() + "</td><td>" + p.getValor().toString() + "</td><td>" + fechaStr + "</td></tr>");        	
        }
        out.println("</table>");
        out.println("</BODY>");
        out.close();
        
        try {
			ServiceProvider.getDao().saveAccion(a);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}
